package com.iot08.common.utils;

import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
import com.iot08.common.entity.util.MailServer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * @author weichao 1299101858@qq.com
 * @version 1.0
 * @date 2021-10-20 14:55
 */
@Slf4j
@Component
public class VerificationCodeUtil {


    //短信模板名称
    @Value("${common.sms.signName:null}")
    private String SMS_SignName;

    //短信模板标识ID
    @Value("${common.sms.templateCode:null}")
    private String SMS_TemplateCode;

    // 对应企业邮箱的密码
    @Value("${common.email.pwd:null}")
    private String Email_Password;

    //配置的企业邮箱(用于发送验证码的邮箱)
    @Value("${common.email.userName:null}")
    private String Email_Username;

    // 邮件的主题
    @Value("${common.email.title:null}")
    private String Email_Title;

    // 邮件的验证码格式内容
    @Value("${common.email.vcodeContent:null}")
    private String Email_VcodeContent;


    private static MailServer mailServer;

    /**
     * 发送/获取验证码
     * @param identStr 标识
     * @param type 类型 0:手机  1:邮箱
     * @time: 2021-10-25 19:08
     * @author: Weichao
     * @version 1.0
     */
    public String getVerificationCode(String identStr ,Integer type, String aVCode){
        //6位验证码
        String vcode = RandomUtil.getRandom(100000, 999999);
        if(aVCode != null){
            vcode = aVCode;
        }
        if(type == 0){
            //TODO 发送手机短信验证码 (暂时先注释, 后续验证完成后再开放)
            //手机号需要符合格式
            if(!isPhoneNum(identStr)){
                //不符合的 直接返回验证码, 不发送短信
                return vcode;
            }
            SendSmsRequest sendSmsRequest = new SendSmsRequest()
                    .setPhoneNumbers(identStr)
                    .setSignName(SMS_SignName)
                    .setTemplateCode(SMS_TemplateCode)
                    .setTemplateParam("{\"code\":\""+vcode+"\"}");

            try {
                SampleUtil.getSignleClient().sendSms(sendSmsRequest);
            }catch (Exception e){
                e.printStackTrace();
                log.error("发送阿里短信失败:"+e.getMessage(),e);
            }



        }else if (type == 1) {
            if(!isEmail(identStr)){
                //不符合的 直接返回验证码, 不发送邮箱验证码
                return vcode;
            }
            //TODO 发送邮箱验证码
            MailServer mailServer = getShareMailServer();
            //显示的主题标题
            mailServer.setPersonal(Email_Title);
            String tempStr = "注册";

            MailUtil.sendToSingle(identStr, Email_Title+":"+tempStr, Email_VcodeContent+"("+tempStr+"):"+vcode, true, mailServer);

        }
        return vcode;

    }

    public boolean sendEmailWithContent(String toEmail ,String title ,String contentStr){
        if(!isEmail(toEmail)){
            //不符合的 直接返回验证码, 不发送邮箱验证码
            return false;
        }
        //TODO 发送邮件
        MailServer mailServer = getShareMailServer();
        //显示的主题标题
        mailServer.setPersonal(title);


        MailUtil.sendToSingle(toEmail, title, contentStr, true, mailServer);
        return true;
    }

    private MailServer getShareMailServer(){
        if(mailServer == null){
            mailServer = new MailServer();
            mailServer.setFromWhere(Email_Username);
            mailServer.setPassword(Email_Password);
            mailServer.setUsername(Email_Username);
            mailServer.setPort(465);
            mailServer.setHost("smtp.exmail.qq.com");
            mailServer.setAuth(true);
        }
        return mailServer;
    }

    /**
     * ^ 匹配输入字符串开始的位置
     * \d 匹配一个或多个数字，其中 \ 要转义，所以是 \\d
     * $ 匹配输入字符串结尾的位置
     */
    //public static final String CHINA_REGEX_EXP = "^((13[0-9])|(14[1,5,7,9])|(15[0-3,5-9])|(16[2,6])|(17[0-9])|(18[0-9])|(19[0,1,2,3,5,6,7,8,9]))\\d{8}$";
    public static final String CHINA_REGEX_EXP = "^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$";
    public static final String HK_REGEX_EXP = "^(5|6|8|9)\\d{7}$";
    public static final String Email_REGEX_EXP = "^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*$";

    public static void main(String[] args) {
        MailServer mailServer = new MailServer();
        mailServer.setFromWhere("yw@iot08.com");
        mailServer.setPassword("xxxx");
        mailServer.setUsername("yw@iot08.com");

        mailServer.setHost("smtp.exmail.qq.com");
        mailServer.setPort(465);
        mailServer.setPersonal("title Personal");
        mailServer.setAuth(true);

        MailUtil.sendToSingle("1299101858@qq.com", "TTTTTTTTT","TTTTTTTTT", true, mailServer);
    }


    public static boolean isEmail(String str) throws PatternSyntaxException {
        Pattern p = Pattern.compile(Email_REGEX_EXP);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    /**
     * 校验是否为大陆号码或香港号码
     *
     * @param str
     * @return 符合规则返回true
     * @throws PatternSyntaxException
     */
    public static boolean isPhoneNum(String str) throws PatternSyntaxException {
        return isChinaPhoneNum(str) || isHkPhoneNum(str);
    }

    /**
     * 大陆手机号码11位数，匹配格式：前三位固定格式+后8位任意数
     * 此方法中前三位格式有：
     * 13+任意数
     * 145,147,149
     * 15+除4的任意数(不要写^4，这样的话字母也会被认为是正确的)
     * 166
     * 17+任意数
     * 18+任意数
     * 198,199
     *
     * @param str
     * @return 正确返回true
     * @throws PatternSyntaxException
     */
    public static boolean isChinaPhoneNum(String str) throws PatternSyntaxException {
        // ^ 匹配输入字符串开始的位置
        // \d 匹配一个或多个数字，其中 \ 要转义，所以是 \\d
        // $ 匹配输入字符串结尾的位置
        Pattern p = Pattern.compile(CHINA_REGEX_EXP);
        Matcher m = p.matcher(str);
        return m.matches();
    }

    /**
     * 香港手机号码8位数，5|6|8|9开头+7位任意数
     *
     * @param str
     * @return 正确返回true
     * @throws PatternSyntaxException
     */
    public static boolean isHkPhoneNum(String str) throws PatternSyntaxException {
        Pattern p = Pattern.compile(HK_REGEX_EXP);
        Matcher m = p.matcher(str);
        return m.matches();
    }



}
